package com.xiyuan.smartutils;

import com.xiyuan.smartutils.constants.HtmlConstants;

import java.util.Map;
import java.util.Map.Entry;

/**
 * HTML扩展工具类
 *
 * @version v1.0.0 @author lgz 2017-8-27 新建与整理
 */

public final class Htmls implements HtmlConstants {
    
    private Htmls(){}
    /**
     * 显示HTML内容格式标签
     *
     * @param charset 编码
     * @return <meta http-equiv="Content-Type" content="text/html; charset=${charset}">
     */
    public static String toContentType(String charset) {
        return "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=" + charset + "\">\r\n";
    }
    
    /**
     * 显示HTML标题标签
     *
     * @param title 标题信息
     * @return <title>${title}</title>
     */
    public static String toTitle(String title) {
        return "<title>" + title + "</title>\r\n";
    }
    
    /**
     * 显示Form表单或href通过iframe调用
     *
     * @return <iframe name="zCallFrame" style="display:none;"></iframe>
     */
    public static String toCallFrame() {
        return "<iframe name=\"pageCallFrame\" style=\"display:none;\"></iframe>";
    }
    /**************************************************************************************/
    //格式化
    /**************************************************************************************/
    
    /**
     * 标准HTML格式化，对<>格式化，保证浏览器解释成字符串而不是代码，且JSON不受影响
     *
     * @param html 要格式化的字符串
     * @return 格式化后的字符串
     */
    public static String format(String html) {
        return (html == null) ? _EMPTY_ : html.replaceAll("<", "&lt;").replaceAll(">", "&gt;");
    }
    
    /**
     * 全部HTML格式化，把&,\',\",<,>替换成&amp;,&apos;,&quot;,&gt;和&lt;，保证浏览器解释成字符串，而不是代码
     *
     * @param html 要格式化的字符串
     * @return 格式化后的字符串
     */
    public static String formatAll(String html) {
        if (html == null) {return _EMPTY_;}
        
        html = html.replaceAll("&", "&amp;");
        //把&放在第一个处理，防止转换的&再被转换一次
        html = html.replaceAll("\'", "&apos;");
        html = html.replaceAll("\"", "&quot;");
        html = html.replaceAll("<", "&lt;");
        html = html.replaceAll(">", "&gt;");
        
        return html;
    }
    
    /**************************************************************************************/
    //过滤
    /**************************************************************************************/
    
    /**
     * HTTP等传输时过滤HTML标签，但支持JSON格式
     *
     * @param html 原字符串
     * @return 过滤<>后的字符串
     */
    public static String filter(String html) {
        return (html == null) ? null : html.replaceAll("[<>]", _EMPTY_);
    }
    
    /**
     * HTTP等传输时过滤可能导致注入的HTML/JS/JSON格式
     *
     * @param html 原字符串
     * @return 过滤<>;'"&后的字符串
     */
    public static String filterAll(String html) {
        return (html == null) ? null : StrUtils.trim(html).replaceAll("[<>;\'\"&]", _EMPTY_);
    }
    
    /**
     * HTTP等传输时过滤可能导致注入的漏洞
     *
     * @param strs 原字符串数组
     * @return 过滤<>;'"&的字符串数组
     */
    public static String[] filterAll(String[] strs) {
        if (strs == null) {return null;}
        
        String[] news = new String[strs.length];
        for (int i = 0; i < strs.length; i++) {
            news[i] = filterAll(strs[i]);
        }
        
        return news;
    }
    
    /**************************************************************************************/
    //表单
    /**************************************************************************************/
    
    /**
     * 生成独立表单HTML形式，自动提交
     *
     * @param id       表单编号
     * @param action   表单目标地址
     * @param method   表单提交方法 GET|POST
     * @param paramMap 表单参数表
     * @return 提交表单HTML文本
     */
    public static String buildAutoSubmitForm(String id, String action, String method, Map<String, Object> paramMap) {
        //待请求参数数组
        StringBuilder strb = new StringBuilder();
        strb.append("<form")
            .append(" id=\"").append(id).append("\"")
            .append(" name=\"").append(id).append("\"")
            .append(" action=\"").append(action).append("\"")
            .append(" method=\"").append(method).append("\">");
        
        for (Entry<String, Object> entry : paramMap.entrySet()) {
            String name = entry.getKey();
            Object value = entry.getValue();
            
            strb.append("<input type=\"hidden\" name=\"")
                .append(name)
                .append("\" value=\"")
                .append(value)
                .append("\"/>");
        }
        
        //submit按钮控件不含name属性，以保证服务器获取时全部为参数
        strb.append("<input type=\"submit\" value=\"submit\" style=\"display:none;\">");
        strb.append("</form>");
        strb.append("<script>document.forms['").append(id).append("'].submit();</script>");
        
        return strb.toString();
    }
}
